package com.limit.rateLimit;

import com.limit.service.TimeWindowLimit;

/**
 * @作者: 林江
 * @创建时间: 2023/12/21
 * @功能: 令牌桶算法
 */
public class TokenBucketTimeWindow implements TimeWindowLimit {
    private long start = System.currentTimeMillis(); // 当前时间的时间戳
    private int capacity = 10; // 定义令牌桶的容量
    private int rate = 2; // 定义每秒钟能够生产2个令牌

    private long token = 5; // 令牌桶的初始容量

    @Override
    public synchronized boolean limit() {
        long end = System.currentTimeMillis();
        // 令牌桶中的令牌
        token = Math.min(capacity, token + ((end - start) / 1000 * rate));
        System.out.println("令牌数：" + token);
        start = end;

        if (token < 1) { // 表示没有令牌了
            return true;
        } else {
            token--;
            return false;
        }
    }
}
